1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.google.common.util.concurrent;
18
19 import static com.google.common.base.Preconditions.checkNotNull;
20
21 import com.google.common.base.Supplier;
22
23 import java.util.concurrent.Callable;
24
25 import javax.annotation.Nullable;
26
27
28
29
30
31
32
33 public final class Callables {
34 private Callables() {}
35
36
37
38
39
40 public static <T> Callable<T> returning(final @Nullable T value) {
41 return new Callable<T>() {
42 @Override public T call() {
43 return value;
44 }
45 };
46 }
47
48
49
50
51
52
53
54
55
56
57 static <T> Callable<T> threadRenaming(final Callable<T> callable,
58 final Supplier<String> nameSupplier) {
59 checkNotNull(nameSupplier);
60 checkNotNull(callable);
61 return new Callable<T>() {
62 @Override public T call() throws Exception {
63 Thread currentThread = Thread.currentThread();
64 String oldName = currentThread.getName();
65 boolean restoreName = trySetName(nameSupplier.get(), currentThread);
66 try {
67 return callable.call();
68 } finally {
69 if (restoreName) {
70 trySetName(oldName, currentThread);
71 }
72 }
73 }
74 };
75 }
76
77
78
79
80
81
82
83
84
85
86 static Runnable threadRenaming(final Runnable task, final Supplier<String> nameSupplier) {
87 checkNotNull(nameSupplier);
88 checkNotNull(task);
89 return new Runnable() {
90 @Override public void run() {
91 Thread currentThread = Thread.currentThread();
92 String oldName = currentThread.getName();
93 boolean restoreName = trySetName(nameSupplier.get(), currentThread);
94 try {
95 task.run();
96 } finally {
97 if (restoreName) {
98 trySetName(oldName, currentThread);
99 }
100 }
101 }
102 };
103 }
104
105
106 private static boolean trySetName(final String threadName, Thread currentThread) {
107
108
109
110 try {
111 currentThread.setName(threadName);
112 return true;
113 } catch (SecurityException e) {
114 return false;
115 }
116 }
117 }